package co.edu.usbcali.egrapico.logica;

import java.util.StringTokenizer;

/**
 * Clase para la traducci�n de la representaci�n de una
 * <Code>Lista de
 * Restricciones</Code> desde <I>GraPiCO Textual</I> hacia <I>C�lculo PiCO</I>.
 * <P> Recibe en <I>GraPiCO Textual</I> alguna de las opciones:<P> <Blockquote><Pre>
 *                   (Restricci�n_1 ^ ... ^ Restricci�n_n)
 *                   Restricci�n
 * </Pre></Blockquote> <P> Traducci�n a <I>C�lculo PiCO</I> de cada
 * constructor:<P> <Blockquote><Pre>
 *                   (Restricci�n_1 ^ ... ^ Restricci�n_n)
 *                   Restricci�n
 * </Pre></Blockquote>
 *
 * @author Johanna Noguera Le�n & Alejandro Berm�dez Mart�nez.
 * @version 1.0
 * @since Enero de 2005
 */
public class ConstraintsList {

    // Variable para almacenar la lista de restricciones representada en c�lculo PiCO.
    String constraintsListPico = "";
    /**
     * Variable tokenizada para guardar las restricciones en GraPiCO textual
     * obtenidas de la lista de restricciones.
     */
    StringTokenizer stConstraintsGraPicoT;
    //Objeto de la clase Constraint, para traducir una restricci�n.
    Constraint constraint;
    // Nombre o lista de nombres de los procesos que se est�n traduciendo.
    String nameCurrentProcess = "";

    /**
     * M�todo constructor de la clase
     * <Code>ConstraintsList</Code>.<P> Separa las restricciones de la
     * <Code>Lista de Restricciones</Code> en <I>GraPiCO Textual</I> usando el
     * s�mbolo de sincronizacion "^", guard�ndolas en un
     * <Code>String</Code> tokenizado.
     *
     * @param constraintsListGraPicoT Expresi�n equivalente a la representaci�n
     * de una
     * <Code>Lista de Restricciones</Code> en <I>GraPiCO Textual</I>.
     * @param nameProcess Nombre o lista de nombres de procesos.
     */
    public ConstraintsList(String constraintsListGraPicoT, String nameProcess) {
        nameCurrentProcess = nameProcess;
        if (constraintsListGraPicoT.indexOf("^") != -1) {
            constraintsListGraPicoT = constraintsListGraPicoT.substring(1, constraintsListGraPicoT.length() - 1);
        }
        stConstraintsGraPicoT = new StringTokenizer(constraintsListGraPicoT, "^");
    }

    /**
     * Metodo generador de la traducci�n de una
     * <Code>Lista de Restricciones</Code>.<P> Se obtiene la traducci�n de cada
     * restricci�n y se concatenan separ�ndolas con el s�mbolo de sincronizaci�n
     * "^".
     *
     * @return la
     * <Code>Lista de Restricciones</Code> traducida a <I>C�lculo PiCO</I>.
     */
    public String traslate() {
        int size = stConstraintsGraPicoT.countTokens();
        // Si solo es una restricci�n, traduzco
        if (size == 1) {
            constraint = new Constraint(stConstraintsGraPicoT.nextToken(), nameCurrentProcess);
            constraintsListPico += constraint.traslate();
        } else {
            // La �ltima restricci�n se env�a a traducir con par�ntesis
            // los cu�les quedan en la expresi�n final
            constraintsListPico += "(";
            while (stConstraintsGraPicoT.hasMoreTokens()) {
                constraint = new Constraint(stConstraintsGraPicoT.nextToken(), nameCurrentProcess);
                if (size != 1) {
                    constraintsListPico += constraint.traslate() + " ^ ";
                } else {
                    constraintsListPico += constraint.traslate();
                }
                size--;
            }
            constraintsListPico += ")";
        }

        return constraintsListPico;
    }
}